// 1.声明构造函数
function Axios(config) {
    // 初始化
    this.default = config;
}

// 原型添加相关的方法
Axios.prototype.request = function(config){
    // 创建promise对象
    let promise = Promise.resolve(config);
    // 声明数组
    let chains = [dispatchRequest, undefined]; // undefined占位
    // 调用then方法指定回调
    let result = promise.then(chains[0], chains[1]);
    return result;
}
// 2.dispatchRequest函数
function dispatchRequest(config) {
    // 调用适配器发送请求
    return xhrAdapter(config).then(res => {
        console.log(res);
        return res;
    }, err => {
        throw err;
    })
}
// 3.Adapter适配器  node环境还是浏览器环境
function xhrAdapter(config){
    console.log(config)
    return new Promise((resolve, reject) => {
        // 发送ajax请求
        let xhr = new XMLHttpRequest();
        // 初始化
        xhr.open(config.method, config.url);
        // 发送
        xhr.send();
        // 绑定事件
        xhr.onreadystatechange = function() {
            console.log(222)
            if(xhr.readyState === 4) {
                if(xhr.status >= 100 && xhr.status < 300) {
                    resolve({
                        config: config, // 配置对象
                        data: xhr.response, // 响应体
                        headers:xhr.getAllResponseHeaders(), // 响应头 字符串
                        request: xhr, // 请求对象
                        status: xhr.status, // 状态码
                        statusText: xhr.statusText // 相应状态字符串
                    })
                } else {
                    reject(new Error('请求失败，失败状态码为' + xhr.status))
                }
            }
        }
    })
}

// 4.创建axios函数
let axios = Axios.prototype.request.bind(null);
axios({method: 'get', url: 'http://localhost:3000/posts'}).then(res => {
    console.log(res);
}).catch(err => {
    console.log(err)
})